package com.icehelper.hades.base.util.httpfluent.config;

import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import javax.net.ssl.SSLException;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.ConnectionClosedException;
import org.apache.http.NoHttpResponseException;
import org.apache.http.conn.ConnectionPoolTimeoutException;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * HttpClientConfig http client配置
 */
@ConfigurationProperties(prefix = "http-client")
@Slf4j
@Data
public class HttpClientConfig {

  /**
   * 默认打印正常日志
   */
  private boolean loggable = true;

  /**
   * 最大连接数
   */
  private int maxTotalConnections = 100;

  /**
   * 每个域名最大连接数
   */
  private int maxConnectionPerRoute = 20;

  /**
   * 最多跳转次数
   */
  private int maxRedirects = 50;

  /**
   * 连接请求超时,单位毫秒
   */
  private int connectionRequestTimeout = 3000;

  /**
   * 连接超时,单位毫秒
   */
  private int connectTimeout = 3000;

  /**
   * 请求超时,单位毫秒
   */
  private int socketTimeout = 30 * 1000;

  /**
   * 是否压缩内容
   */
  private boolean contentCompressionEnabled = true;

  /**
   * 最大空闲时间,单位毫秒
   */
  private int idle = 10 * 1000;

  /**
   * 重试次数
   */
  private int retry = 0;

  /**
   * 连接使用前检测前提(不活跃时间,单位毫秒,非正数表示关闭检测)
   */
  private int periodValidateInactivity = 2 * 1000;

  /**
   * 连接最大存活时间,单位毫秒
   */
  private int connTimeToLive = 30 * 1000;

  /**
   * 在重试次数内，允许重试的异常
   */
  private Class<?>[] retryAllowException = {SocketTimeoutException.class, NoHttpResponseException.class, ConnectionClosedException.class,
      ConnectionPoolTimeoutException.class};

  /**
   * 在重试次数内，不允许重试的异常
   */
  private Class<?>[] retryForbiddenException = {UnknownHostException.class, SSLException.class};

  /**
   * 在重试次数内，不需要上报metric的异常
   */
  private Class<?>[] retryMetricExcludeException = {};

  /**
   * 在重试次数内，不需要打印log的异常
   */
  private Class<?>[] retryLogExcludeException = {};

}
